import csv  # 导入模块csv来处理以CSV(逗号分隔的值)格式存储的天气数据
from matplotlib import pyplot as plt
from datetime import datetime

# 从文件中获取日期、最高气温和最低气温
#filename = 'sitka_weather_07-2014.csv' # sitka7月份的气温
filename = 'sitka_weather_2014.csv' # sitka全年气温
with open(filename) as f:   # 打开文件，并将结果文件对象存储在f中
    reader = csv.reader(f)  # 创建一个与该文件相关联的阅读器（reader）对象
                            # readers处理文件中以逗号分隔的第一行数据，
                            # 并将每项数据都作为一个元素存储在列表中
    header_row = next(reader)   # 返回文件中的下一行（这里得到的是第一行，其中包含文件头）
    #for index, column_header in enumerate(header_row):  # 调用枚举方法enumerate()
                                                        # 获取每个元素的索引及其值
        #print(index, column_header)

    dates, highs, lows = [], [], []  # 三个空列表用于提取日期、最高气温和最低气温
    for row in reader:  # 遍历文件中余下的各行
        current_date = datetime.strptime(row[0], "%Y-%m-%d")
        # datetime.strptime()方法的工作原理
        # 第一个实参为包含所需日期的字符串，第二个实参告诉Python如何设置日期的格式
        dates.append(current_date)

        high = int(row[1])  # 第二项是最高温度，将字符串转换为数字，以便matplotlib能够读取它们
        highs.append(high)

        low = int(row[3])
        lows.append(low)
    #print(highs)

    # 根据数据绘制图形
    # 函数figure()用于指定图标的宽度/高度/分辨率和背景色
    # figsize：窗口的尺寸（单位:英寸） dpi:分辨率
    fig = plt.figure(dpi=128, figsize=(10, 6))
    # 实参alpha指定颜色的透明度：0为完全透明，1(默认设置)为完全不透明
    plt.plot(dates, highs, c='red', alpha=0.5) # alpha=0.5可让折线颜色看起来更浅
    plt.plot(dates, lows, c='blue', alpha=0.5)
    # 方法plt.fill_between()需要一个x值系列dates，两个y值系列highs和lows
    # 实参facecolor指定了填充区域的颜色
    # alpha=0.1让填充区域将两个数据系列连接起来的同时不分散观察者的注意力
    plt.fill_between(dates, highs, lows, facecolor = 'blue', alpha=0.1)
    # 设置图形的格式
    #plt.title("Daily high temperatures, July 2014", fontsize=24)
    plt.title("Daily high and low temperatures - 2014", fontsize=24)
    plt.xlabel('', fontsize=16)
    fig.autofmt_xdate() # 调用fig.autofmt_xdate()绘制斜的日期标签以免彼此重叠
    plt.ylabel('Temperature(F)', fontsize=16)
    plt.tick_params(axis='both', which='major', labelsize=16)

    plt.show()